#ifndef __tenacitas_state_machine__machine__h__
#define __tenacitas_state_machine__machine__h__



/** @file */


/** @todo */

// ==> C++ Headers

// ==> 3rds Headers

// ==> Our Headers

// ==> Namespaces
using namespace std;

// ==> Macro Constants

// ==> Macro Commands


/** ==> namespace of the organization */
namespace tenacitas {
    /** ==> namespace for the project */
    namespace state_machine {
        /**  ==> exhibitor, integrator, processor, storer, communicator */
        namespace processor {

            // ==> Typedefs 

            // ==> Pre-Declarations

            // ==> Attributes 

            // ==> Functions

            // ==> Classes

            /** 
                @nosubgrouping 
            */
            template <typename t_supplier>
            class transition {

                // ==> transition - Friends

                /** Class allowed to access private members of @p transition, in order
                    to perform tests */
                friend class transition_tester;

            public:

                // ==> transition - Public Internal Types

                /** Must implement 
                    @code

                    @endcode
                */
                typedef t_supplier supplier;

                /** Must implement 
                    @code

                    @endcode
                */
                typedef typename supplier::event event;

                /** Must implement 
                    @code

                    @endcode
                */                
                typedef typename supplier::state state;

                /** Must implement 
                    @code

                    @endcode
                */
                typedef typename supplier::handler handler;


                // ==> transition - Public Constructors

                /** Destructor */
                ~transition( );

                /** */
                transition(state && p_from, state && p_to, event && p_event, handler && p_handler) {
                    m_from = std::move(p_from);
                    m_to = std::move(p_to);
                    m_event = std::move(p_event);
                    m_handler = std::move(p_handler);
                }


                // ==> transition - Public Accessors

                // ==> transition - Public Helpers
  
                // ==> transition - Public transitions

                // ==> transition - Public Operators

                /** */

                // ==> transition - Public Attributes

            private:

                // ==> transition - Private Internal Types

                // ==> transition - Private Constructors

                // ==> transition - Private Accessors

                // ==> transition - Private Helpers

                // ==> transition - Private transitions

                // ==> transition - Private Operators

                // ==> transition - Private Attributes

                state m_from;
                state m_to;
                event m_event;
                handler m_handler;
            };
        }
    }
}
// =============================================================================
// I M P L E M E N T A T I O N
// =============================================================================

using namespace tenacitas::state_machine::processor;


#endif
